///////////////////////////////////////////////////////////////////////////////
// Name:        wrdc.h
// Purpose:     usual functions or macro of C type code
// Author:      Bright Li
// Modified by:
// Created:     2018-09-03
// Version:     [0.1.2]
// RCS-ID:      $$
// Copyright:   (c) Bright Li
// Licence:
///////////////////////////////////////////////////////////////////////////////

#pragma once
#ifndef _WRDC_H__
#define _WRDC_H__

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

/*-----------------------------------------------------------------*\
    默认宏定义
\*-----------------------------------------------------------------*/
#ifndef __cplusplus
    #define nullptr NULL
#endif

// 以下宏用于标识函数参数的输入/输出状态
#define PARAM_IN
#define PARAM_OUT
#define PARAM_DUPLEX

// 动态数组及初始化，用于消除C/C++区别
#ifdef __cplusplus
    #define CharArray(name, n) char name[n]={}
    #define UCharArray(name, n) unsigned char name[n]={}
#else
    #define CharArray(name, n) \
    char name[n]; memset(name,0,n)
    #define UCharArray(name, n) \
    unsigned char name[n]; memset(name,0,n)
#endif

// 计算数组长度
#define dim(x) (sizeof(x)/sizeof(x[0]))

// Nan-end array（复合文字）
#define sum(...) sum_array((double[]){ __VA_ARGS__, NAN })

// 函数向量化
#define Fn_apply(type, callback, ...){  \
    void *stopper_for_apply = (int[]){0};  \
    type **list_for_apply = (type*[]){__VA_ARGS__, stopper_for_apply};  \
    for(int i=0; list_for_apply[i] != stopper_for_apply; i++)  \
        callback(list_for_apply[i]);}

// 释放任意多个 malloc 变量
#define Free_list(...) Fn_apply(void, free, __VA_ARGS__);

// C-Type Foreach function
#define Foreach_string(iterator, ...)\
    for(char **iterator = (char*[]){__VA_ARGS__, NULL}; *iterator; iterator++)

#endif  // _WRDC_H__
